package apresentacaoSwing;

import apresentacaoSwing.TelaNovoImovel;
import apresentacaoSwing.TelaSistemaImobiliaria;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import negocio.Imovel;
import negocio.GerenteImovel;
import negocio.Utilidades;

public class TelaImovel {

	private static final String FRM_PRINCIPAL_TITULO = "Menu Imoveis";
	private static final int FRM_PRINCIPAL_LARGURA = 650;
	private static final int FRM_PRINCIPAL_ALTURA = 400;
	private static final Color FRM_PRINCIPAL_COR_FUNDO = Color.WHITE;
	
	private static final Color TB_DADOS_COR_FUNDO = Color.WHITE;
	private static final Color TB_DADOS_CABEC_COR_FUNDO = Color.BLUE;
	private static final Color TB_DADOS_CABEC_COR_TEXTO = Color.BLACK;
	private static final String[] TITULOS_COLUNAS = {"Numero de Registro ", "Endere�o","Tipo", "Valor"
		};
	
	private static final Color PN_TITULO_COR_FUNDO = Color.WHITE;
	private static final Color PN_TITULO_COR_TEXTO = Color.BLACK;
	private static final Color PN_BORDA_COR = Color.BLUE;
	
	private static final String PN_CONSULTAS_TITULO = "Consultas";
	private static final Color PN_CONSULTAS_COR_FUNDO = Color.WHITE;
	private static final Color PN_CONSULTAS_ACOES_COR_FUNDO = Color.WHITE;

	private static final String PN_MAIS_OPCOES_TITULO = "Opcoes";
	private static final Color PN_MAIS_OPCOES_COR_FUNDO = Color.WHITE;
	private static final String[] PN_MAIS_OPCOES_NOMES = {"Adicionar", "Alterar", "Remover","Menu Principal"};
	
	private JFrame frmPrincipal;
	
	private JTable tbDados;
		
	private JRadioButton rbPorReg;
	private JRadioButton rbPorEnd;
	private JRadioButton rbPorProp;
	
	private JPanel pnConsultaReg;
	private JPanel pnConsultaEnd;
	private JPanel pnConsultaProp;
	
	private JTextField tfConsultaReg;
	private JTextField tfConsultaEnd;
	private JTextField tfConsultaProp;
	
	private GerenteImovel gerImovel;

	public TelaImovel(TelaSistemaImobiliaria telaSistema, GerenteImovel gerImovel, int i) {
		this.gerImovel = gerImovel;
		montaJanela();
	}

	public void mostrar() {
		frmPrincipal.setVisible(true);
	}

	public void alteraLinhaTabela(Imovel i, int numLinha) {
		DefaultTableModel tm = (DefaultTableModel) tbDados.getModel();
		tm.setValueAt(i.getRegImovel(), numLinha, 0);
		tm.setValueAt(i.getEndereco(), numLinha, 1);
		tm.setValueAt(i.getTipo(), numLinha, 2);
		tm.setValueAt(("R$")+i.getValor(), numLinha, 3);
		tbDados.repaint();
	}
	
	private void montaJanela() {
		
		// Cria e altera propriedades da janela
		frmPrincipal = new JFrame(FRM_PRINCIPAL_TITULO);
		frmPrincipal.setSize(FRM_PRINCIPAL_LARGURA, FRM_PRINCIPAL_ALTURA);
		frmPrincipal.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmPrincipal.setLayout(new BorderLayout());
		frmPrincipal.getContentPane().setBackground(FRM_PRINCIPAL_COR_FUNDO);
		frmPrincipal.setLocationRelativeTo(null);
		frmPrincipal.addWindowListener(new ManipuladorJanela());
		
		// Parte superior da janela, contendo as opcoes de consulta e demais operacoes.
		JPanel pnOpcoes = new JPanel(new BorderLayout());
		pnOpcoes.add(montaPanelConsultas(), BorderLayout.CENTER);
		pnOpcoes.add(montaPanelOpcoes(), BorderLayout.EAST);
		pnOpcoes.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
		pnOpcoes.setBackground(FRM_PRINCIPAL_COR_FUNDO);
		frmPrincipal.add(pnOpcoes, BorderLayout.NORTH);
		
		// Parte inferior da janela, contendo a tabela com os dados dos contatos.
		tbDados = new JTable();
		tbDados.setBackground(TB_DADOS_COR_FUNDO);
		tbDados.getTableHeader().setBackground(TB_DADOS_CABEC_COR_FUNDO);
		tbDados.getTableHeader().setForeground(TB_DADOS_CABEC_COR_TEXTO);
		JScrollPane pnDados = new JScrollPane(tbDados);
		pnDados.getViewport().setBackground(FRM_PRINCIPAL_COR_FUNDO);
		frmPrincipal.add(pnDados, BorderLayout.CENTER);	
	}
	
	private JPanel montaPanelConsultas() {
	
		JPanel pnConsultas = new JPanel();
		pnConsultas.setLayout(new BorderLayout());
		pnConsultas.setBorder(BorderFactory.createEmptyBorder(0,0,0,5));
		pnConsultas.setOpaque(false);

		JLabel titulo = new JLabel(PN_CONSULTAS_TITULO);
		titulo.setBackground(PN_TITULO_COR_FUNDO);
		titulo.setForeground(PN_TITULO_COR_TEXTO);
		titulo.setOpaque(true);
		pnConsultas.add(titulo, BorderLayout.NORTH);
		
		JPanel pnOpcoes = new JPanel(new BorderLayout());
		pnOpcoes.setBackground(PN_CONSULTAS_COR_FUNDO);
		pnOpcoes.setBorder(BorderFactory.createLineBorder(PN_BORDA_COR));
		pnOpcoes.add(montaPanelOpcoesConsulta(), BorderLayout.NORTH);
		pnOpcoes.add(montaPanelAcoesConsulta(), BorderLayout.SOUTH);
		pnConsultas.add(pnOpcoes, BorderLayout.CENTER);
				
		return pnConsultas;
	}
	
	private JPanel montaPanelOpcoesConsulta() {
		
		ManipuladorBotoesConsultas ev = new ManipuladorBotoesConsultas();
		
		ButtonGroup bgConsultas = new ButtonGroup();
		
		rbPorReg = new JRadioButton("Registro do Imovel");
		rbPorReg.addActionListener(ev);
		rbPorReg.setOpaque(false);
		bgConsultas.add(rbPorReg);
		
		rbPorEnd = new JRadioButton("Endereco");
		rbPorEnd.addActionListener(ev);
		rbPorEnd.setOpaque(false);
		bgConsultas.add(rbPorEnd);
	
		rbPorProp = new JRadioButton("Proprietario");
		rbPorProp.addActionListener(ev);
		rbPorProp.setOpaque(false);
		bgConsultas.add(rbPorProp);
		
		JPanel pnBotoes = new JPanel();
		pnBotoes.setLayout(new FlowLayout(FlowLayout.CENTER));
		pnBotoes.setOpaque(false);
		pnBotoes.add(rbPorReg);
		pnBotoes.add(rbPorEnd);
		pnBotoes.add(rbPorProp);
		
		return pnBotoes;
	}
	
	private JPanel montaPanelAcoesConsulta() {
		
		JPanel pnAcoes = new JPanel();
		pnAcoes.setBackground(PN_CONSULTAS_ACOES_COR_FUNDO);
		
		pnConsultaReg = new JPanel();
		pnConsultaReg.setVisible(false);
		pnConsultaReg.setOpaque(false);
				
		pnConsultaReg.add(new JLabel("Digite o numero de registro ou parte do numero: "));
		
		tfConsultaReg = new JTextField(20);
		tfConsultaReg.addActionListener(
				new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						gerImovel.consultaPorReg(tfConsultaReg.getText());					
					}
				});
		pnConsultaReg.add(tfConsultaReg);
				
		pnAcoes.add(pnConsultaReg);
		
		pnConsultaEnd = new JPanel();
		pnConsultaEnd.setVisible(false);
		pnConsultaEnd.setOpaque(false);
				
		pnConsultaEnd.add(new JLabel("Digite o endereco ou parte do endereco: "));
		
		tfConsultaEnd = new JTextField(20);
		tfConsultaEnd.addActionListener(
				new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						gerImovel.consultaPorEnd(tfConsultaEnd.getText());					
					}
				});
		pnConsultaEnd.add(tfConsultaEnd);
				
		pnAcoes.add(pnConsultaEnd);
		
		pnConsultaProp = new JPanel();
		pnConsultaProp.setOpaque(false);
		pnConsultaProp.setVisible(false);
		
		pnConsultaProp.add(new JLabel("Digite o nome do proprietario ou parte dele:"));
		
		tfConsultaProp = new JTextField(20);
		tfConsultaProp.addActionListener(
				new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						gerImovel.consultaPorProp(tfConsultaProp.getText());					
					}
				});
		
		return pnAcoes;
	}
	
	private JPanel montaPanelOpcoes() {
		
		JPanel pnOpcoes = new JPanel(new BorderLayout());
		pnOpcoes.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
		pnOpcoes.setOpaque(false);

		JLabel lbTitulo = new JLabel(PN_MAIS_OPCOES_TITULO);
		lbTitulo.setBackground(PN_TITULO_COR_FUNDO);
		lbTitulo.setForeground(PN_TITULO_COR_TEXTO);
		lbTitulo.setOpaque(true);
		pnOpcoes.add(lbTitulo, BorderLayout.NORTH);

		// Adiciona painel contendo botoes para as opcoes
		JPanel pnConteudo = new JPanel();
		JPanel pnBotoes = new JPanel(new GridLayout(PN_MAIS_OPCOES_NOMES.length,1,2,2));
		pnBotoes.setOpaque(false);
		
		JButton btAdicionar = new JButton(PN_MAIS_OPCOES_NOMES[0]);
		btAdicionar.addActionListener(new ManipuladorBotaoAdicionar(this));
		pnBotoes.add(btAdicionar);
		
		JButton btRemover = new JButton(PN_MAIS_OPCOES_NOMES[2]);
		btRemover.addActionListener(new ManipuladorBotaoRemover());
		pnBotoes.add(btRemover);		
		
		JButton btMPrincipal = new JButton(PN_MAIS_OPCOES_NOMES[3]);
		btMPrincipal.addActionListener(new ManipuladorBotaoMPrincipal(this));
		pnBotoes.add(btMPrincipal);
		
		pnConteudo.setBackground(PN_MAIS_OPCOES_COR_FUNDO);
		pnConteudo.setBorder(BorderFactory.createLineBorder(PN_BORDA_COR));
		pnConteudo.add(pnBotoes);
		pnOpcoes.add(pnConteudo, BorderLayout.CENTER);
		
		return pnOpcoes;
	}

	private class ManipuladorBotoesConsultas implements ActionListener {

		public void actionPerformed(ActionEvent e) {
			
			pnConsultaReg.setVisible(e.getSource() == rbPorReg);
			pnConsultaEnd.setVisible(e.getSource() == rbPorEnd);
			pnConsultaProp.setVisible(e.getSource() == rbPorProp);
		
		}
				
	}

	private class ManipuladorBotaoAdicionar implements ActionListener {

		private TelaImovel telaI;
		
		public ManipuladorBotaoAdicionar(TelaImovel telaI) {
			this.telaI = telaI;
		}
	
		public void actionPerformed(ActionEvent e) {
			
			TelaNovoImovel i = new TelaNovoImovel(
										telaI,
										null,
										0);
			i.mostrar();
			
		}
	
	}

	private class ManipuladorBotaoRemover implements ActionListener {
		
		public void actionPerformed(ActionEvent e) {
		
			int numLinha = tbDados.getSelectedRow();
			
			if(numLinha >= 0) {
				
				Imovel i = gerImovel.consultaPorReg((String) tbDados.getValueAt(numLinha,0));
				
				if(JOptionPane.showConfirmDialog(frmPrincipal, "Deseja remover o imovel "+i.getRegImovel()+"?",
						"Remocao de Imovel", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
					
					gerImovel.remover(i);

					DefaultTableModel tm = (DefaultTableModel) tbDados.getModel();
					tm.removeRow(numLinha);
					tbDados.repaint();
				}
				
			} else {
				JOptionPane.showMessageDialog(null,
						"Selecione uma linha da lista de imoveis antes de remover.",
						"Erro",
						JOptionPane.ERROR_MESSAGE);
			}
		}
		
	}
	
	private class ManipuladorBotaoMPrincipal implements ActionListener {

		private TelaImovel telaI;
		
		public ManipuladorBotaoMPrincipal(TelaImovel telaI) {
			this.telaI = telaI;
		}
	
		public void actionPerformed(ActionEvent e) {
			
			TelaSistemaImobiliaria tsi = new TelaSistemaImobiliaria();
			tsi.mostrar();
			frmPrincipal.dispose();
			
			
		}
	
	}
	
	private class ManipuladorJanela extends WindowAdapter {
		
		public void windowClosing(WindowEvent e) {
			try{
				
				//gerCliente.adicionar();
				
			} catch (Exception exc) {
				
				JOptionPane.showMessageDialog(null,
						exc.getMessage(),
						"Erro",
						JOptionPane.ERROR_MESSAGE);
			}
		}
		
	}
}